package produce.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author : xiaohong
 * @date : 2021/4/11 15:29
 * 主题模式配置
 *
 * 该种类型的交换机会是对上述fanout和direct类型的交换机的一种扩展。其和direct很类似，但是匹配规则上有所不同。其约定的路由匹配规则有：
 * routingkey通过符号“.”进行分割，其分割出来的单词就是路由的匹配元素。比如com.aa.tian这种就表示顺序单词com、aa、tian。
 * 符号“*”和“#”分别用来进行模糊匹配，其中“*”用来表示一个单词，“#”用来匹配多个单词。
 * 总结一下就是符号“*”表征一个单词，“#”表征多个单词。
 *
 */

@Configuration
public class TopicConfig {

    // 声明注册topic模式的交换机
    @Bean
    public TopicExchange topicExchange(){
        // 交换机名称 是否持久化 是否自动删除
        // 持久化： 服务器重启后该交换机是否还存在
        // 自动删除： 完成任务后是否自动删除该交换机
        return new TopicExchange("topic_exchange",true,false);
    }

    // 声明队列topic1 topic2 topic3

    // 参数1 声明队列
    // 参数2 durable：持久化 erlang 数据库，有专门的表去保存我们的队列声明
    // 参数3 exclusive：排外 当前定义的队列connection中的channel是共享的，其他的connection是访问不到的
    // 参数4 autoDelete：自动删除 当前最后一个consumer断开之后，autoDelete队列
    // 参数5 agruments：rabbitmq的扩展

    @Bean
    public Queue topic1() {
        return new Queue("topic1",true);
    }

    @Bean
    public Queue topic2() {
        return new Queue("topic2",true);
    }

    @Bean
    public Queue topic3() {
        return new Queue("topic3",true);
    }

    @Bean
    public Queue topic4() {
        return new Queue("topic4",true);
    }


    //完成队列和交换机的绑定关系

    /**
     * * 代表任意一个，且只能是一个
     * # 代表任意多个，可以没有
     * @return
     */

    @Bean
    public Binding topic1Binding(){
        return BindingBuilder.bind(topic1()).to(topicExchange()).with("#.topic1.*");
    }

    @Bean
    public Binding topic2Binding(){
        return BindingBuilder.bind(topic2()).to(topicExchange()).with("*.topic2.*");
    }

    @Bean
    public Binding topic3Binding(){
        return BindingBuilder.bind(topic3()).to(topicExchange()).with("*.topic3.#");
    }

    @Bean
    public Binding topic4Binding(){
        return BindingBuilder.bind(topic4()).to(topicExchange()).with("#.topic4.#");
    }


}
